package org.darkgem;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * Git 帮助
 */
public class GitAux {

    //默认指令
    static final String DEFAULT_HELP_CMD = "help";
    static volatile GitAux instance;
    /**
     * 命令
     */
    Map<String, Cmd> cmdMap = new ConcurrentHashMap<String, Cmd>();

    private GitAux() {
    }

    public static void main(String[] args) {
        //注册
        //help
        {
            GitAux.getInstance().register(new Cmd() {
                @Override
                public String cmd() {
                    return DEFAULT_HELP_CMD;
                }

                @Override
                public void todo(String[] option) {
                    //读取所有注册的CMD
                    List<Cmd> cmdList = GitAux.getInstance().touch();
                    for (Cmd cmd : cmdList) {
                        System.out.println(cmd.help());
                    }
                }

                @Override
                public String help() {
                    return String.format("%s -> 帮助", DEFAULT_HELP_CMD);
                }
            });
        }
        //空文件夹处理
        {
            GitAux.getInstance().register(new Cmd() {
                final String CMD_NAME = "folder";

                @Override
                public String cmd() {
                    return CMD_NAME;
                }

                @Override
                public void todo(String[] option) {
                    String dir = option[0];
                    String emptyFileName = option.length > 1 ? option[1] : ".gitkeep";
                    try {
                        fuck(new File(dir), emptyFileName);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("FINISH");
                }

                /**
                 * 添加/删除 指定空文件
                 * */

                void fuck(File file, String emptyFileName) throws IOException {
                    if (!(file.getName().startsWith(".git")
                            || file.getName().startsWith(".svn"))
                            && file.exists() && file.isDirectory()) {
                        //若目录下没有文件则直接删除
                        if (file.listFiles().length == 0) {
                            //创建空文件
                            File newFile = new File(file, emptyFileName);
                            newFile.createNewFile();
                            System.out.println(String.format("[create] %s", newFile.getAbsolutePath()));
                        } else {
                            //判断该目录下是否存在空文件s
                            File emptyFile = new File(file, emptyFileName);
                            if (emptyFile.exists() && file.listFiles().length > 1) {
                                //存在空文件，且还有其他文件，则删除这个空文件
                                emptyFile.delete();
                                System.out.println(String.format("[delete] %s", emptyFile.getAbsolutePath()));
                            }
                            //进入子目录检测
                            for (File file1 : file.listFiles()) {
                                fuck(file1, emptyFileName);
                            }
                        }
                    }
                }

                @Override
                public String help() {
                    return String.format("%s path [.gitkeep] -> 添加/删除 git辅助空文件夹占有文件", CMD_NAME);
                }
            });
        }
        //执行
        {
            GitAux.getInstance().cmd(args);
        }
    }

    public static GitAux getInstance() {
        if (instance == null) {
            synchronized (GitAux.class) {
                if (instance == null) {
                    instance = new GitAux();
                }
            }
        }
        return instance;
    }

    /**
     * 解析命令
     */
    void cmd(String[] args) {
        Cmd cmd = null;
        if (args.length > 0) {
            String name = args[0];
            cmd = cmdMap.get(name);
        }
        //尝试获取 默认
        if (cmd == null) {
            cmd = cmdMap.get(DEFAULT_HELP_CMD);
        }
        if (cmd == null) {
            throw new RuntimeException("不存在指令帮助模块");
        } else {
            String[] options;
            try {
                options = Arrays.copyOfRange(args, 1, args.length);
            } catch (Exception e) {
                options = new String[0];
            }
            cmd.todo(options);
        }
    }

    /**
     * 注册
     */
    public void register(Cmd cmd) {
        if (cmdMap.containsKey(cmd.cmd())) {
            throw new RuntimeException(String.format("重复注册: %s", cmd.cmd()));
        } else {
            cmdMap.put(cmd.cmd(), cmd);
        }
    }

    /**
     * 获取所有的CMD
     */
    public List<Cmd> touch() {
        List<Cmd> ret = new ArrayList<Cmd>();
        for (String key : cmdMap.keySet()) {
            ret.add(cmdMap.get(key));
        }
        return ret;
    }


    /**
     * 命令接口
     */
    interface Cmd {
        /**
         * 注册的命令
         */
        String cmd();

        /**
         * 需要去做的task
         */
        void todo(String[] option);

        /**
         * 帮助说明
         */
        String help();
    }

}
